package jgespres;

import java.awt.*;
import java.util.*;
import java.text.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

/**
 * Gestionnaire de Thèmes de présentation.
 * 
 * @author guerfyld
 * @version 2.0
 */
public class JThemesMgr extends JPanel {
    // Element à gerer
    private ThemesCatalog       thmCat;
    // Eléments de l'interface
    private JTable              jThmTable;
    
    /**
     * Constructor for objects of class JThemesMgr
     * 
     * @param themesCatalog     Catalogue des thèmes à gerer
     */
    public JThemesMgr(ThemesCatalog themesCatalog) {
        super();

        thmCat = themesCatalog;
        createGUI();
    }
    
    private void createGUI() {
        final Font f = new Font("Times New Roman", Font.PLAIN, 16);
        // Défintition Table des thèmes
        JScrollPane tablePane = new JScrollPane();
        jThmTable = new JTable();
        jThmTable.setAutoCreateColumnsFromModel(false);
        jThmTable.setFont(f);
        jThmTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        jThmTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        jThmTable.setRowHeight(20);
        jThmTable.setModel(thmCat);
        final TableCellRenderer cellDate = new DefaultTableCellRenderer() {
            private final DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
            public Component getTableCellRendererComponent(JTable table, 
                        Object value, boolean isSelected, boolean hasFocus, 
                        int row, int column) {
                if (isSelected) {
                    setForeground(jThmTable.getSelectionForeground());
                    setBackground(jThmTable.getSelectionBackground());
                }
                else {
                    setForeground(Color.BLACK);
                    setBackground(Color.WHITE);
                }
                setText( df.format((Date) value) );
                setFont(f);
                return this;
            } 
        };
        TableColumnModel tcm = new DefaultTableColumnModel()  {
            // Fixe largeur des colonnes de la table et CellRenderer de la colonne Date
            public void addColumn(TableColumn tc) {
                switch (tc.getModelIndex()) {
                    case 0:
                        tc.setPreferredWidth(100);
                        break;
                    case 1:
                        tc.setPreferredWidth(75);
                        tc.setCellRenderer(cellDate);
                        break;
                    case 2:
                        tc.setPreferredWidth(200);
                        break;
                    case 3:
                        tc.setPreferredWidth(600);
                        break;
                }
                super.addColumn(tc);
            }  
        };
        jThmTable.setColumnModel(tcm);
        jThmTable.setTableHeader(new JTableHeader(tcm) {
            // Implemente des Info Bulles sur les Entête de colonnes de la Table
            public String getToolTipText(MouseEvent evt) {
                Point p = evt.getPoint();
                int index = columnModel.getColumnIndexAtX(p.x);
                int realIndex = columnModel.getColumn(index).getModelIndex();
                
                return jgespres.getResourceString("Theme.Col" + realIndex + ".tooltip");
            }
        }); 
        jThmTable.createDefaultColumnsFromModel();
        //jThmTable.setPreferredScrollableViewportSize(new Dimension(800, 300));
        jThmTable.addMouseListener(new MouseAdapter() {
            // Gestion double click sur thème
            public void mousePressed(MouseEvent e) {
                if(e.getClickCount() == 2)
                    chgTheme();
            }
        });
        tablePane.setViewportView(jThmTable);

        // Définition Boutons de gestion de la table des thèmes
        JPanel buttonsPane = new JPanel();
        buttonsPane.setLayout( new BoxLayout(buttonsPane, BoxLayout.Y_AXIS) );
        buttonsPane.setPreferredSize(new Dimension(125, 400) );
        // -> Bouton Ajouter
        JButton button = new JButton();
        button.setIcon(new ImageIcon(getClass().getResource("/jgespres/images/add.png")));
        button.setText(jgespres.getResourceString("Theme.Add"));
        button.setToolTipText(jgespres.getResourceString("Theme.Add.tooltip"));
        button.setHorizontalAlignment(SwingConstants.LEFT);
        button.setIconTextGap(10);
        button.setMaximumSize(new Dimension(125, 30));
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                addTheme();
            }
        });
        buttonsPane.add(button);
        // -> Bouton Modifier
        button = new JButton();
        button.setIcon(new ImageIcon(getClass().getResource("/jgespres/images/chg.png")));
        button.setText(jgespres.getResourceString("Theme.Chg"));
        button.setToolTipText(jgespres.getResourceString("Theme.Chg.tooltip"));
        button.setHorizontalAlignment(SwingConstants.LEFT);
        button.setIconTextGap(10);
        button.setMaximumSize(new Dimension(125, 30));
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                chgTheme();
            }
        });
        buttonsPane.add(button);
        // -> Bouton Supprimer
        button = new JButton();
        button.setIcon(new ImageIcon(getClass().getResource("/jgespres/images/cancel.png")));
        button.setText(jgespres.getResourceString("Theme.Del"));
        button.setToolTipText(jgespres.getResourceString("Theme.Del.tooltip"));
        button.setHorizontalAlignment(SwingConstants.LEFT);
        button.setIconTextGap(10);
        button.setMaximumSize(new Dimension(125, 30));
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                delTheme();
            }
        });
        buttonsPane.add(button);
        
        setLayout( new BorderLayout(1, 2) );
        add(tablePane, BorderLayout.CENTER);
        add(buttonsPane, BorderLayout.EAST);        
    }
    
    private void addTheme() {
        Theme Thm;
        
        // Affiche boite de dialogue
        JThemeEditor jD = new JThemeEditor();
        do {
            Thm = new Theme();
            jD.setEditor(Thm);
            jD.setVisible(true);
        
            if (jD.isChanged()) {
                // Ajout du théme au catalogue
                thmCat.addTheme(Thm);

                // Force mise à jour affichage JTable
                int newRow = thmCat.getDatePosTheme(Thm.getId());
                thmCat.fireTableRowsInserted(newRow, newRow);
            }
        } while (jD.doNext());
        
        // Suppression de la boite de dialogue
        jD.dispose();
    }
    
    private void chgTheme() {
        Theme Thm;
        
        int row = jThmTable.getSelectedRow();
        if (row >= 0) {
            // Affiche boite de dialogue
            JThemeEditor jD = new JThemeEditor();
            do {
                Thm = thmCat.getTheme(row);
                jD.setEditor(Thm);
                jD.setVisible(true);
            
                if (jD.isChanged()) {
                    // Mise à jour du theme
                    thmCat.updTheme(Thm);
            
                    // Force mise à jour affichage JTable (sans réordenancement)
                    thmCat.fireTableRowsUpdated(row, row);
                }
                
                if (++row > thmCat.getNbThemes()) break;
            } while (jD.doNext());

            // Suppression de la boite de dialogue
            jD.dispose();        
            // Réodenancement des thèmes
            thmCat.reload();
            // Rechargement de la liste des thémes
            thmCat.fireTableDataChanged();
        }
    }
    
    private void delTheme() {
        int row = jThmTable.getSelectedRow();
        if (row >= 0) {
            thmCat.delTheme(row);

            // Force mise à jour affichage JTable
            thmCat.fireTableRowsDeleted(row, row);
        }    
    }
}
